#ifndef TAG_H
#define TAG_H
#include "str.h"

#define TAG_MAX_ATTR 32
#define TAG_MAX_STR_SIZE 256

typedef struct
{
  char key[TAG_MAX_STR_SIZE];
  char val[TAG_MAX_STR_SIZE];
} tag_attr_t;

typedef struct 
{
  char name[TAG_MAX_STR_SIZE];
  str_t tok; // the heap buffer containing tag contents
  bool end; //end tag i.e. "</ .. >"
  tag_attr_t attrs[TAG_MAX_ATTR];
  int nattrs;

  //_tag()
  //{
  //  end = false;
  //  nattrs = 0;
  //}

} tag_t;

typedef struct
{
  tag_t *v;
  int c,n;
  bool init;

  //_tstack()
  //{
  //	init = false;
  //}
} tstack_t;

//const tag_attr_t DEFAULT_TAG_ATTR =
//{
//  {'\0'}, {'\0'}
//};

const tag_t DEFAULT_TAG =
{
  {},
  DEFAULT_STR,
  0,
  {},
  0
};

const tstack_t DEFAULT_TSTACK = 
{
  0,0,0,0
};

void tstack_top( tstack_t *ts, tag_t **pt);

void tstack_push(tstack_t *ts, tag_t *t);

bool tstack_pop(tstack_t *ts, tag_t *t);

void tstack_create(tstack_t *ts);

void tstack_free_tags(tstack_t *ts);

void tstack_free(tstack_t *ts);

void tstack_clear(tstack_t *ts);

void tstack_invert(tstack_t *dst, tstack_t *src);

void make_tag( str_t* tok, tag_t *t);

void make_tok( str_t* dst, str_t *src);

#endif
